﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Services;
using System.Web.UI.WebControls;
using Voluntariar.Sistema.DAO;
using Voluntariar.Sistema.Entidades;

namespace Voluntariar.WEB
{
	public partial class DetalhesUserMensagens : Voluntariar.WEB.Util.PaginaBase
	{

		#region Atributos

		public bool executaServidor = true;

		public int VSCodigoDestino
		{
			get
			{
				if (ViewState["VSCodigoDestino"] == null)
					return 0;
				return (int)ViewState["VSCodigoDestino"];
			}
			set { ViewState["VSCodigoDestino"] = value; }
		}

		private List<MensagensPrivada> ListaMensagensPrivada
		{
			get
			{
				if (!(HttpContext.Current.Session["ssListaRepresentante"] is List<MensagensPrivada>))
					HttpContext.Current.Session["ssListaRepresentante"] = new List<MensagensPrivada>();
				return HttpContext.Current.Session["ssListaRepresentante"] as List<MensagensPrivada>;
			}
			set
			{
				HttpContext.Current.Session["ssListaRepresentante"] = value;
			}
		}

		#endregion

		#region Eventos

		protected void Page_Load(object sender, EventArgs e)
		{

			if (!IsPostBack)
			{
				if (executaServidor)
				{
					executaServidor = false;
					ConectaServidor();
				}

				this.AmigosUsuarios.IDUsuario = Util.Sessao.ObjUsuario.ID;
				GetUsuarioImagem();
				if (Util.Sessao.listaMensagensPrivada.Count > 0)
				{
					ListaMensagensPrivada = Util.Sessao.listaMensagensPrivada;
					gdvConversa.DataSource = ListaMensagensPrivada.OrderByDescending(x => x.ID);
					gdvConversa.DataBind();
					pgdvConversa.Visible = true;
					pnl.Visible = false;
					Util.Sessao.listaMensagensPrivada = null;
				}
				else
				{
					PreencheMensagens();
					pgdvConversa.Visible = false;
					pnl.Visible = true;

				}
			}
		}

		protected void lnbMensagem_Click(object sender, EventArgs e)
		{
			try
			{
				Util.Sessao.iParametro = 0;
				Util.Sessao.listaMensagensPrivada = new System.Collections.Generic.List<MensagensPrivada>();
				Response.Redirect("/DetalhesUserMensagens.aspx", false);
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		protected void gdvMensagens_RowDataBound(object sender, GridViewRowEventArgs e)
		{
			try
			{
				if (e.Row.RowType == DataControlRowType.DataRow)
				{
					e.Row.Attributes.Add("onClick", ClientScript.GetPostBackClientHyperlink(gdvMensagens, "Editar$" + e.Row.RowIndex));
				}
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}

		}

		protected void gdvMensagens_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			try
			{
				int index = 0;

				if (e.CommandName == "Editar")
				{
					index = Convert.ToInt32(e.CommandArgument);
					if (Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioOrigemID")).Text).Equals(Util.Sessao.ObjUsuario.ID))
					{
						
						List<MensagensPrivada> lista = MensagensPrivadaDAO.PesquisaMensagensConversa(Util.Sessao.ObjUsuario.ID, Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioDestinoID")).Text));
						VSCodigoDestino = Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioDestinoID")).Text);
						Util.Sessao.iParametro = VSCodigoDestino;

						pgdvConversa.Visible = true;
						pnl.Visible = false;
						ListaMensagensPrivada = lista;
						gdvConversa.DataSource = lista.OrderByDescending(x => x.ID);
						gdvConversa.DataBind();
					}
					else if (Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioDestinoID")).Text).Equals(Util.Sessao.ObjUsuario.ID))
					{
						List<MensagensPrivada> lista = MensagensPrivadaDAO.PesquisaMensagensConversa(Util.Sessao.ObjUsuario.ID, Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioOrigemID")).Text));
						VSCodigoDestino = Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblusuarioOrigemID")).Text);
						Util.Sessao.iParametro = VSCodigoDestino;

						pgdvConversa.Visible = true;
						pnl.Visible = false;
						ListaMensagensPrivada = lista;
						gdvConversa.DataSource = lista;
						gdvConversa.DataBind();

					}
				}

			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		protected void gdvConversa_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			try
			{
				int index = 0;


				if (e.CommandName == "Excluir")
				{
					index = Convert.ToInt32(e.CommandArgument);
					MensagensPrivadaDAO.Excluir(Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblID")).Text));

					List<MensagensPrivada> listaNew = new List<MensagensPrivada>();
					foreach (MensagensPrivada msg in ListaMensagensPrivada)
					{
						if (!msg.ID.Equals(Convert.ToInt32(((Label)((GridView)sender).Rows[index].FindControl("lblID")).Text)))
						{
							listaNew.Add(msg);
						}
					}

					ListaMensagensPrivada = listaNew;
					gdvConversa.DataSource = listaNew;
					gdvConversa.DataBind();



				}
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		protected void lnbExcluir_OnClick(object sender, EventArgs e)
		{
			try
			{

				MensagensPrivada MensagensPrivada = MensagensPrivadaDAO.Pesquisar(Convert.ToInt32((((ImageButton)sender)).CommandArgument));
				if (MensagensPrivada.usuarioOrigem.ID.Equals(Util.Sessao.ObjUsuario.ID))
				{
					MensagensPrivadaDAO.Excluir(Convert.ToInt32((((ImageButton)sender)).CommandArgument));

					List<MensagensPrivada> listaNew = new List<MensagensPrivada>();
					foreach (MensagensPrivada msg in ListaMensagensPrivada)
					{
						if (!msg.ID.Equals(Convert.ToInt32((((ImageButton)sender)).CommandArgument)))
						{
							listaNew.Add(msg);
						}
					}

					if (!listaNew.Count.Equals(0))
					{
						ListaMensagensPrivada = listaNew;
						gdvConversa.DataSource = listaNew;
						gdvConversa.DataBind();
					}
					else
					{
						PreencheMensagens();
					}
				}
				else
				{
					Util.Mensagem.MensagemTemporizada("Você so pode excluir suas mensagens .");

				}
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		protected void lnbEnviar_OnClick(object sender, EventArgs e)
		{
			try
			{
				MensagensPrivada MensagensPrivada = new MensagensPrivada();
				MensagensPrivada.mensagem = txtMensagem.Text;
				MensagensPrivada.usuarioOrigem = Util.Sessao.ObjUsuario;
				if (VSCodigoDestino > 0)
					MensagensPrivada.usuarioDestino = UsuarioDAO.Pesquisar(VSCodigoDestino);
				else if (Util.Sessao.iParametro > 0)
				{
					MensagensPrivada.usuarioDestino = UsuarioDAO.Pesquisar(Util.Sessao.iParametro);
					Util.Sessao.iParametro = 0;
				}
				MensagensPrivada.situacao = true;
				MensagensPrivada.dataEnvio = DateTime.Now;
				MensagensPrivada.DataSistema = DateTime.Now;

				MensagensPrivada = MensagensPrivadaDAO.Salvar(MensagensPrivada);
				MensagensPrivada = MensagensPrivadaDAO.Pesquisar(MensagensPrivada.ID);
				ListaMensagensPrivada.Add(MensagensPrivada);

				gdvConversa.DataSource = ListaMensagensPrivada;
				gdvConversa.DataBind();
				txtMensagem.Text = string.Empty;
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		#endregion

		#region Métodos

		public string getSRC(int origem, int destino)
		{
			string url = string.Empty;
			try
			{
				if (!origem.Equals(Util.Sessao.ObjUsuario.ID))
				{
					Usuarios Usuarios = UsuarioDAO.Pesquisar(origem);
					if (Usuarios.imagem == "NoImage")
					{
						return ResolveUrl(@"~/ImagemUsuarios/missing.jpg");
					}
					else
					{
						return ResolveUrl("~/ImagemUsuarios/" + Usuarios.imagem.ToString());
					}
				}
				else if (!destino.Equals(Util.Sessao.ObjUsuario.ID))
				{
					Usuarios Usuarios = UsuarioDAO.Pesquisar(destino);

					if (Usuarios.imagem == "NoImage")
					{
						return ResolveUrl(@"~/ImagemUsuarios/missing.jpg");
					}
					else
					{
						return ResolveUrl("~/ImagemUsuarios/" + Usuarios.imagem.ToString());
					}
				}


			}
			catch (Exception ex)
			{
				TratarErro(ex);

			}
			return url;
		}

		public string getSRCConversa(int origem)
		{
			string url = string.Empty;
			try
			{
				Usuarios Usuarios = UsuarioDAO.Pesquisar(origem);
				if (Usuarios.imagem == "NoImage")
				{
					return ResolveUrl(@"~/ImagemUsuarios/missing.jpg");
				}
				else
				{
					return ResolveUrl("~/ImagemUsuarios/" + Usuarios.imagem.ToString());
				}
			}
			catch (Exception ex)
			{
				TratarErro(ex);

			}
			return url;
		}

		public string getNome(int origem)
		{
			try
			{
				string nome = string.Empty;
				Usuarios Usuarios = UsuarioDAO.Pesquisar(origem);
				return Usuarios.nome;
			}
			catch (Exception ex)
			{
				TratarErro(ex);
				return string.Empty;
			}
		}

		public void PreencheMensagens()
		{
			try
			{
				List<Usuarios> listaUsuarios = UsuarioDAO.PesquisaMensagemPrivadaOrigemDestino(Util.Sessao.ObjUsuario.ID);
				List<MensagensPrivada> listaMensagens = new List<MensagensPrivada>();
				foreach (Usuarios usuarios in listaUsuarios)
				{
					MensagensPrivada MensagensPrivada = new MensagensPrivada();
					MensagensPrivada = MensagensPrivadaDAO.PesquisaMensagemPrivadaPorUsuario(usuarios.ID);
					listaMensagens.Add(MensagensPrivada);
				}

				gdvMensagens.DataSource = listaMensagens.OrderByDescending(x => x.ID);
				gdvMensagens.DataBind();

			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		public void GetUsuarioImagem()
		{
			try
			{
				if (Util.Sessao.ObjUsuario.imagem.Equals("NoImage"))
				{
					UserImage.ImageUrl = "~/ImagemUsuarios/missing.jpg";
				}
				else
				{
					UserImage.ImageUrl = "~/ImagemUsuarios/" + Util.Sessao.ObjUsuario.imagem;
				}
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		public void ConectaServidor()
		{
			try
			{
				new ChatServidor.ChatServidor(IPAddress.Parse("127.0.0.1")).IniciaAtendimento();
			}
			catch (Exception ex)
			{
				TratarErro(ex);
			}
		}

		#endregion

		#region WebMethods

		[WebMethod]
		public static string[] TimeOut()
		{
			
			//txtLog.AppendText("Monitorando as conexões...\r\n");
			List<MensagensPrivada> lista = MensagensPrivadaDAO.PesquisaMensagensConversa(Util.Sessao.ObjUsuario.ID, Util.Sessao.iParametro);
			Util.Sessao.listaMensagensPrivada = lista;

			return new string[] { };
		}

		#endregion

	}
}
